#!/bin/bash

# ===========================================
# Docker 最新版一键安装脚本
# 文件名：install-docker-latest.sh
# 适用于：阿里云宝塔Linux系统（CentOS 7/8/9，Alibaba Cloud Linux）
# 作者：无畏侠
# 版本：1.4
# 修改记录：
# v1.4 - 修复网络连接问题，增加国内镜像源支持
# v1.3 - 修复Alibaba Cloud Linux系统检测优先级问题
# v1.2 - 增加Alibaba Cloud Linux系统支持，修复版本检测逻辑
# v1.1 - 修复CentOS版本检测逻辑，增加多种检测方式
# v1.0 - 初始版本，支持Docker最新版安装和配置
# ===========================================

# 设置脚本参数
DOCKER_VERSION="latest"
DOCKER_COMPOSE_VERSION="v2.27.0"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# 系统检查
check_system() {
    log_info "开始系统检查..."
    
    # 检查root权限
    if [[ $EUID -ne 0 ]]; then
        log_error "请使用root权限运行此脚本"
        exit 1
    fi
    
    # 检查操作系统
    if [[ -f /etc/redhat-release ]]; then
        # 特殊处理Alibaba Cloud Linux系统
        if grep -q "Alibaba Cloud Linux" /etc/redhat-release; then
            OS="Alibaba Cloud Linux"
            # Alibaba Cloud Linux 3 对应 CentOS 8 兼容性
            if grep -q "release 3" /etc/redhat-release; then
                CENTOS_VERSION=8
                log_info "检测到系统：Alibaba Cloud Linux 3 (兼容CentOS 8)"
            else
                log_error "不支持的Alibaba Cloud Linux版本，请检查/etc/redhat-release文件内容"
                log_info "文件内容：$(cat /etc/redhat-release)"
                exit 1
            fi
        else
            OS="CentOS"
            # 多种方式尝试获取CentOS版本号
            if CENTOS_VERSION=$(grep -oE '[0-9]+\.[0-9]+' /etc/redhat-release | cut -d. -f1 2>/dev/null); then
                log_info "检测到系统：CentOS $CENTOS_VERSION"
            elif CENTOS_VERSION=$(grep -oE 'release [0-9]+' /etc/redhat-release | cut -d' ' -f2 2>/dev/null); then
                log_info "检测到系统：CentOS $CENTOS_VERSION"
            elif CENTOS_VERSION=$(cat /etc/redhat-release | sed 's/.*release //' | sed 's/\..*//' 2>/dev/null); then
                log_info "检测到系统：CentOS $CENTOS_VERSION"
            else
                log_error "无法检测系统版本号，请检查/etc/redhat-release文件内容"
                log_info "文件内容：$(cat /etc/redhat-release)"
                exit 1
            fi
        fi
    else
        log_error "不支持的操作系统，仅支持CentOS和Alibaba Cloud Linux"
        exit 1
    fi
    
    # 检查系统版本兼容性
    if [[ $CENTOS_VERSION -lt 7 ]]; then
        log_error "系统版本过低，需要CentOS 7或更高版本（或兼容系统）"
        exit 1
    fi
    
    log_success "系统检查完成"
}

# 卸载已安装的Docker
uninstall_docker() {
    log_info "检查系统中是否已安装Docker..."
    
    # 检查Docker是否运行
    if systemctl is-active --quiet docker; then
        log_warning "检测到Docker服务正在运行，正在停止..."
        systemctl stop docker
        systemctl stop docker.socket
        sleep 2
    fi
    
    # 卸载Docker软件包
    if command -v docker >/dev/null 2>&1; then
        log_info "开始卸载Docker..."
        
        # 停止所有Docker容器
        docker stop $(docker ps -aq) 2>/dev/null || true
        
        # 卸载Docker软件包
        yum remove -y docker docker-client docker-client-latest \
            docker-common docker-latest docker-latest-logrotate \
            docker-logrotate docker-engine docker-ce docker-ce-cli \
            containerd.io docker-buildx-plugin docker-compose-plugin
        
        # 删除Docker相关文件
        rm -rf /var/lib/docker
        rm -rf /var/lib/containerd
        rm -rf /etc/docker
        rm -rf /var/run/docker.sock
        
        # 删除Docker用户组
        groupdel docker 2>/dev/null || true
        
        log_success "Docker卸载完成"
    else
        log_info "系统中未检测到Docker安装"
    fi
}

# 安装依赖包
install_dependencies() {
    log_info "安装系统依赖包..."
    
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    log_success "依赖包安装完成"
}

# 配置Docker仓库
setup_docker_repo() {
    log_info "配置Docker仓库..."
    
    # 优先使用国内镜像源
    log_info "尝试使用阿里云Docker镜像源..."
    if yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo; then
        log_success "阿里云Docker镜像源配置成功"
    else
        log_warning "阿里云镜像源配置失败，尝试官方源..."
        if yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo; then
            log_success "Docker官方仓库配置成功"
        else
            log_error "所有Docker仓库配置均失败，请检查网络连接"
            log_info "建议手动配置仓库或使用离线安装方式"
            exit 1
        fi
    fi
    
    # 更新yum缓存
    yum makecache
}

# 安装Docker引擎
install_docker_engine() {
    log_info "开始安装Docker引擎..."
    
    yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
    log_success "Docker引擎安装完成"
}

# 配置Docker服务
configure_docker() {
    log_info "配置Docker服务..."
    
    # 创建Docker配置文件目录
    mkdir -p /etc/docker
    
    # 配置Docker守护进程
    cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "data-root": "/var/lib/docker"
}
EOF
    
    # 启动Docker服务
    systemctl start docker
    systemctl enable docker
    
    # 验证Docker安装
    docker --version
    
    log_success "Docker服务配置完成"
}

# 安装Docker Compose
install_docker_compose() {
    log_info "安装Docker Compose..."
    
    # 使用固定版本避免网络问题
    COMPOSE_VERSION="v2.27.0"
    
    # 尝试使用国内镜像下载
    log_info "尝试使用国内镜像下载Docker Compose..."
    if curl -L --connect-timeout 30 "https://ghproxy.com/https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose; then
        log_success "Docker Compose下载成功"
    else
        log_warning "国内镜像下载失败，尝试官方源..."
        if curl -L --connect-timeout 60 "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose; then
            log_success "Docker Compose下载成功"
        else
            log_error "Docker Compose下载失败，请检查网络连接"
            log_info "可以稍后手动安装：https://docs.docker.com/compose/install/"
            return 1
        fi
    fi
    
    # 设置执行权限
    chmod +x /usr/local/bin/docker-compose
    
    # 创建符号链接
    ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    # 验证安装
    if docker-compose --version >/dev/null 2>&1; then
        log_success "Docker Compose安装完成，版本：${COMPOSE_VERSION}"
    else
        log_error "Docker Compose安装验证失败"
        return 1
    fi
}

# 配置防火墙
configure_firewall() {
    log_info "配置防火墙规则..."
    
    # 检查防火墙状态
    if systemctl is-active --quiet firewalld; then
        # 开放Docker相关端口
        firewall-cmd --permanent --add-port=2375/tcp
        firewall-cmd --permanent --add-port=2376/tcp
        firewall-cmd --permanent --add-port=80/tcp
        firewall-cmd --permanent --add-port=443/tcp
        firewall-cmd --permanent --add-port=22/tcp
        firewall-cmd --reload
        
        log_success "防火墙规则配置完成"
        log_info "已开放端口：22(SSH), 80(HTTP), 443(HTTPS), 2375-2376(Docker)"
    else
        log_warning "防火墙服务未运行，跳过防火墙配置"
        log_info "建议手动配置防火墙："
        log_info "1. 启用firewalld: systemctl enable --now firewalld"
        log_info "2. 或使用宝塔面板防火墙功能"
        log_info "3. 或配置iptables规则"
    fi
}

# 生成运维脚本
generate_maintenance_scripts() {
    log_info "生成Docker运维脚本..."
    
    # 创建运维脚本目录
    mkdir -p /opt/docker-scripts
    
    # 生成启动脚本
    cat > /opt/docker-scripts/start-docker.sh << 'EOF'
#!/bin/bash
# Docker启动脚本
systemctl start docker
echo "Docker服务已启动"
EOF
    
    # 生成停止脚本
    cat > /opt/docker-scripts/stop-docker.sh << 'EOF'
#!/bin/bash
# Docker停止脚本
systemctl stop docker
echo "Docker服务已停止"
EOF
    
    # 生成重启脚本
    cat > /opt/docker-scripts/restart-docker.sh << 'EOF'
#!/bin/bash
# Docker重启脚本
systemctl restart docker
echo "Docker服务已重启"
EOF
    
    # 生成状态查看脚本
    cat > /opt/docker-scripts/status-docker.sh << 'EOF'
#!/bin/bash
# Docker状态查看脚本
systemctl status docker
EOF
    
    # 生成日志查看脚本
    cat > /opt/docker-scripts/logs-docker.sh << 'EOF'
#!/bin/bash
# Docker日志查看脚本
journalctl -u docker -f
EOF
    
    # 设置执行权限
    chmod +x /opt/docker-scripts/*.sh
    
    log_success "运维脚本生成完成"
}

# 验证安装
verify_installation() {
    log_info "验证Docker安装..."
    
    # 检查Docker版本
    docker --version
    
    # 检查Docker服务状态
    systemctl status docker --no-pager -l
    
    # 运行测试容器
    docker run --rm hello-world
    
    log_success "Docker安装验证完成"
}

# 安装总结
installation_summary() {
    log_success "========================================"
    log_success "Docker安装完成！"
    log_success "========================================"
    log_success "安装信息汇总："
    log_success "- Docker版本: $(docker --version | cut -d' ' -f3 | cut -d',' -f1)"
    
    # 检查Docker Compose是否安装成功
    if command -v docker-compose >/dev/null 2>&1; then
        log_success "- Docker Compose版本: $(docker-compose --version | cut -d' ' -f3 | cut -d',' -f1)"
    else
        log_warning "- Docker Compose: 安装失败，请手动安装"
    fi
    
    log_success "- 服务状态: $(systemctl is-active docker)"
    log_success "- 开机自启: $(systemctl is-enabled docker)"
    log_success "- 运维脚本: /opt/docker-scripts/"
    log_success "========================================"
}

# 主函数
main() {
    echo "========================================"
    echo "Docker 最新版一键安装脚本"
    echo "适用于：阿里云宝塔Linux系统"
    echo "作者：无畏侠"
    echo "版本：v1.4"
    echo "========================================"
    
    # 执行安装步骤
    check_system
    uninstall_docker
    install_dependencies
    setup_docker_repo
    install_docker_engine
    configure_docker
    install_docker_compose
    configure_firewall
    generate_maintenance_scripts
    verify_installation
    installation_summary
    
    echo ""
    log_info "安装完成！建议重启系统以确保所有配置生效"
}

# 执行主函数
main "$@"